package roboguice.inject;
import static org.junit.Assert.assertTrue;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ActivityController;
import roboguice.RoboGuice;
import roboguice.activity.RoboActivity;
import com.google.inject.Inject;
import com.google.inject.Key;
import com.google.inject.Singleton;
import android.app.Activity;
@RunWith(RobolectricTestRunner.class)
public class ContextScopeTest {
@Test
public void shouldHaveContextInScopeMapAfterOnCreate() throws Exception {
final ActivityController<A> aController = Robolectric.buildActivity(A.class);
final A a = aController.get();
assertThat(a.getScopedObjectMap().size(), equalTo(0));
aController.create();
boolean found=false;
for( Object o : a.getScopedObjectMap().values() )
if( o==a )
found = true;
assertTrue("Couldn't find context in scope map", found);
}
@Test
public void shouldBeAbleToOpenMultipleScopes() {
final ContextScope scope = RoboGuice.getOrCreateBaseApplicationInjector(Robolectric.application).getInstance(ContextScope.class);
final Activity a = Robolectric.buildActivity(A.class).get();
final Activity b = Robolectric.buildActivity(B.class).get();
scope.enter(a);
scope.enter(b);
scope.exit(b);
scope.exit(a);
}
@Test(expected = IllegalArgumentException.class)
public void shouldNotBeAbleToExitTheWrongScope() {
final ContextScope scope = RoboGuice.getOrCreateBaseApplicationInjector(Robolectric.application).getInstance(ContextScope.class);
final Activity a = Robolectric.buildActivity(A.class).get();
final Activity b = Robolectric.buildActivity(B.class).get();
scope.enter(a);
scope.enter(b);
scope.exit(a);
}
@Test
public void shouldHaveTwoItemsInScopeMapAfterOnCreate() throws Exception {
final ActivityController<B> bController = Robolectric.buildActivity(B.class);
final B b = bController.get();
assertThat(b.getScopedObjectMap().size(), equalTo(0));
bController.create();
boolean found=false;
for( Object o : b.getScopedObjectMap().values() )
if( o==b )
found = true;
assertTrue("Couldn't find context in scope map", found);
assertTrue(b.getScopedObjectMap().containsKey(Key.get(C.class)));
}
public static class A extends RoboActivity {
}
public static class B extends RoboActivity {
@Inject C c; // context scoped
@Inject D d; // unscoped
@Inject E e; // singleton
}
@ContextSingleton
public static class C {}
public static class D {}
@Singleton
public static class E {}
}